package com.mamesoft.namibiamc.beans;

import com.itextpdf.text.Utilities;
import com.mamesoft.namibiamc.tools.JDBC;
import com.mamesoft.namibiamc.tools.Utility;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import hirondelle.date4j.DateTime;
import java.io.Serializable;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.TimeZone;

public class VisitaPazientiBean implements Serializable {

    private String input = "";
    private String descrizione = "";
    private String tipologia = "";
    private int idMedico = -1;
    private ArrayList<String> richiamo;
    private ArrayList<Integer> ritardoRichiamo;
    private Date data;
    private boolean renderPazienteError = false;
    private boolean renderTipologiaError = false;
    private boolean renderDescrizioneError_lunga = false;
    private boolean renderDescrizioneError_corta = false;
    private boolean renderCalendarError = false;
    private boolean renderSuccess = false;
    private boolean renderUnsuccess = false;

    public VisitaPazientiBean() {
    }

    private void cleanBean() {
        input = "";
        descrizione = "";
        tipologia = "";
        idMedico = -1;
        richiamo = null;
        ritardoRichiamo = null;
        data = null;
        renderPazienteError = false;
        renderTipologiaError = false;
        renderDescrizioneError_lunga = false;
        renderDescrizioneError_corta = false;
        renderCalendarError = false;
        renderUnsuccess = false;
    }

    public void action() {
        Connection c = null;
        int idPaziente = -1;
        boolean error = true;
        try {
            renderUnsuccess = false;
            renderSuccess = false;
            error = checkError();
            if (!error) {
                Timestamp t = new Timestamp(getData().getTime());
                idPaziente = (int) Integer.valueOf(getInput().split(" ")[0]);
                String visitaFatta = "INSERT INTO `ppw_progetto2`.`cartella` (`pID`, `mID`, `data`, `tipo_visita`, `descrizione`, `is_fatta`) "
                        + "VALUES ('" + idPaziente + "', '" + getIdMedico() + "', CURRENT_TIMESTAMP, 'spontanea', '" + getDescrizione() + "', 'T');";
                String visitaProgrammata = "INSERT INTO `ppw_progetto2`.`cartella` (`pID`, `mID`, `data`, `tipo_visita`, `descrizione`, `is_fatta`) "
                        + "VALUES ('" + idPaziente + "', '" + getIdMedico() + "', '" + t.toString() + "', 'programmata', '', 'F');";

                c = JDBC.connect();
                JDBC.executeStatement(visitaFatta, c);
                JDBC.executeStatement(visitaProgrammata, c);

                String q = "SELECT email,capo_villaggio FROM paziente WHERE id ='" + idPaziente + "'";
                ResultSet set = JDBC.executeQuery(q, c);
                String mail = "";
                int capoVillaggio = -1;
                if (set.next()) {
                    mail = set.getString("email");
                    capoVillaggio = set.getInt("capo_villaggio");
                }
                q = "SELECT nome,cognome FROM anagrafe WHERE id ='" + idPaziente + "'";
                set = JDBC.executeQuery(q, c);
                String nomePaziente = null;
                if (set.next()) {
                    nomePaziente = set.getString("nome") + " " + set.getString("cognome");
                }
                DateTime d = DateTime.now(TimeZone.getDefault());
                if (mail == null){
                    mail="";
                }
                if (!mail.equals("") && nomePaziente != null) {
                    Utility.sendEmail(mail, Utility.toPDF(String.valueOf(getIdMedico()), d.format("DD/MM/YYYY"), getDescrizione(), nomePaziente));
                } else {
                    q = "SELECT email FROM paziente WHERE id ='" + capoVillaggio + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        mail = set.getString("email");
                    }
                    Utility.sendEmail(mail, Utility.toPDF(String.valueOf(getIdMedico()), d.format("DD/MM/YYYY"), getDescrizione(), nomePaziente));
                }
            }
        } catch (Exception ex) {
        } finally {
            try {
                c.close();
            } catch (Exception ex) {
            }
        }
        if (error) {
            renderUnsuccess = true;
        } else {
            cleanBean();
            renderSuccess = true;
        }
    }

    public boolean checkError() {
        boolean error = false;

        if (checkPaziente() == false) {
            renderPazienteError = true;
            error = true;
        } else {
            renderPazienteError = false;
        }

        if (getTipologia().isEmpty()) {
            renderTipologiaError = true;
            error = true;
        } else {
            renderTipologiaError = false;
        }

        if (getDescrizione().isEmpty()) {
            renderDescrizioneError_corta = true;
            error = true;
        } else {
            renderDescrizioneError_corta = false;
        }

        if (getDescrizione().length() > 160) {
            renderDescrizioneError_lunga = true;
            error = true;
        } else {
            renderDescrizioneError_lunga = false;
        }

        if (getData() == null) {
            renderCalendarError = true;
            error = true;
        } else {
            if (getData().before(new Date())) {
                renderCalendarError = true;
                error = true;
            } else {
                renderCalendarError = false;
            }
        }
        return error;
    }

    public boolean checkPaziente() {
        Connection c = null;
        ResultSet set = null;
        try {
            int id = (int) Integer.valueOf(getInput().split(" ")[0]);
            c = JDBC.connect();
            String q = "SELECT ID FROM paziente WHERE ID ='" + id + "'";
            set = JDBC.executeQuery(q, c);
            if (set.next()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception ex) {
            return false;
        } finally {
            try {
                c.close();
                set.close();
            } catch (Exception ex) {
            }
        }
    }

    /**
     * @return the input
     */
    public String getInput() {
        return input;
    }

    /**
     * @param input the input to set
     */
    public void setInput(String input) {
        this.input = input;
    }

    /**
     * @return the descrizione
     */
    public String getDescrizione() {
        return descrizione;
    }

    /**
     * @param descrizione the descrizione to set
     */
    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    /**
     * @return the richiamo
     */
    public ArrayList<String> getRichiamo() {
        if (richiamo == null) {
            richiamo = new ArrayList<String>();
        }
        if (ritardoRichiamo == null) {
            ritardoRichiamo = new ArrayList<Integer>();
        }
        Connection c = null;
        ResultSet set = null;
        try {
            c = JDBC.connect();
            String q = "SELECT * "
                    + "FROM scaletta "
                    + "WHERE tipo='programmata' OR tipo ='periodica' ORDER BY descrizione ASC";
            set = JDBC.executeQuery(q, c);
            while (set.next()) {
                richiamo.add(set.getString("descrizione"));
                ritardoRichiamo.add(set.getInt("valore"));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                c.close();
                set.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }

        return richiamo;
    }

    /**
     * @return the data
     */
    public Date getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(Date data) {
        this.data = data;
    }

    public void setData() {
        int i = getRichiamo().indexOf(getTipologia());
        try {
            int delay = ritardoRichiamo.get(i);
            Timestamp t = new Timestamp(System.currentTimeMillis() + (delay * 1000));
            setData(new Date(t.getTime()));
        } catch (IndexOutOfBoundsException ex) {
            Timestamp t = new Timestamp(System.currentTimeMillis());
            setData(new Date(t.getTime()));
        }
    }

    /**
     * @return the tipologia
     */
    public String getTipologia() {
        return tipologia;
    }

    /**
     * @param tipologia the tipologia to set
     */
    public void setTipologia(String tipologia) {
        this.tipologia = tipologia;
    }

    /**
     * @param richiamo the richiamo to set
     */
    public void setRichiamo(ArrayList<String> richiamo) {
        this.setRichiamo(richiamo);
    }

    /**
     * @return the renderPazienteError
     */
    public boolean isRenderPazienteError() {
        return renderPazienteError;
    }

    /**
     * @param renderPazienteError the renderPazienteError to set
     */
    public void setRenderPazienteError(boolean renderPazienteError) {
        this.renderPazienteError = renderPazienteError;
    }

    /**
     * @return the renderTipologiaError
     */
    public boolean isRenderTipologiaError() {
        return renderTipologiaError;
    }

    /**
     * @param renderTipologiaError the renderTipologiaError to set
     */
    public void setRenderTipologiaError(boolean renderTipologiaError) {
        this.renderTipologiaError = renderTipologiaError;
    }

    /**
     * @return the renderDescrizioneError_lunga
     */
    public boolean isRenderDescrizioneError_lunga() {
        return renderDescrizioneError_lunga;
    }

    /**
     * @param renderDescrizioneError_lunga the renderDescrizioneError_lunga to set
     */
    public void setRenderDescrizioneError_lunga(boolean renderDescrizioneError_lunga) {
        this.renderDescrizioneError_lunga = renderDescrizioneError_lunga;
    }

    /**
     * @return the renderDescrizioneError_corta
     */
    public boolean isRenderDescrizioneError_corta() {
        return renderDescrizioneError_corta;
    }

    /**
     * @param renderDescrizioneError_corta the renderDescrizioneError_corta to set
     */
    public void setRenderDescrizioneError_corta(boolean renderDescrizioneError_corta) {
        this.renderDescrizioneError_corta = renderDescrizioneError_corta;
    }

    /**
     * @return the renderCalendarError
     */
    public boolean isRenderCalendarError() {
        return renderCalendarError;
    }

    /**
     * @param renderCalendarError the renderCalendarError to set
     */
    public void setRenderCalendarError(boolean renderCalendarError) {
        this.renderCalendarError = renderCalendarError;
    }

    /**
     * @return the renderSuccess
     */
    public boolean isRenderSuccess() {
        return renderSuccess;
    }

    /**
     * @param renderSuccess the renderSuccess to set
     */
    public void setRenderSuccess(boolean renderSuccess) {
        this.renderSuccess = renderSuccess;
    }

    /**
     * @return the renderUnsuccess
     */
    public boolean isRenderUnsuccess() {
        return renderUnsuccess;
    }

    /**
     * @param renderUnsuccess the renderUnsuccess to set
     */
    public void setRenderUnsuccess(boolean renderUnsuccess) {
        this.renderUnsuccess = renderUnsuccess;
    }

    /**
     * @return the idMedico
     */
    public int getIdMedico() {
        return idMedico;
    }

    /**
     * @param idMedico the idMedico to set
     */
    public void setIdMedico(int idMedico) {
        this.idMedico = idMedico;
    }
}
